package com.example.yupao.common;

/**
 * 返回工具类, 因为很多地方要用, 不想重复写 new BaseResponse<>(200, user, "ok");
 * 替我们返回成功或者失败, 也相当于提取出来封装一下
 *
 * @author 宝儿姐
 */
public class ResultUtils {
    /**
     * 成功
     * 这种就是泛型方法的写法, 返回值前面加一个 <T> 告诉编译器这是泛型方法
     *
     * @param data
     * @param <T>
     * @return
     */
    // 返回给前端的 data
    public static <T> BaseResponse<T> success(T data) {
//        return new BaseResponse<>(200, data, "ok");
        // 注意我们约定的是成功返回 0, 不是传统意义的200
        return new BaseResponse<>(0, data, "ok");
    }

    /**
     * 失败
     *
     * @param errorCode
     * @return
     */
    public static BaseResponse error(ErrorCode errorCode) {
        // 错误返回， 数据就返回为 null 即可
        // return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());
        /**
         *
         */
        // 注意这个地方到底带不带 <> , 二者写上都没有报错， 实际上是涉及到 java 泛型的类型推断
        // BaseResponse<>是一个泛型类，它接受一个类型参数T。
        // 当你使用 new BaseResponse<>(errorCode);时，Java会使用类型推断来自动推断T的类型。
        // 在这种情况下，Java会尝试推断errorCode的类型，并使用这个类型作为T的类型。

        // 然而，如果你使用 new BaseResponse(errorCode);
        // Java将不会进行类型推断，而是将errorCode的类型作为T的类型。
        // 也就是说，在这种情况下，T的类型将是ErrorCode，而不是具体的类型

        // 在实际使用中，这两种方式的区别可能并不明显。
        // 然而，如果你的ErrorCode类是另一个泛型类的实例，
        // 那么使用 new BaseResponse<>(errorCode); 将导致编译错误，因为Java无法推断出T的具体类型。
        // 在这种情况下，你必须使用 new BaseResponse<>(errorCode); 来明确指定T的类型。
        return new BaseResponse(errorCode);
    }

    /**
     * 传递的参数中没有 data, 也就用不到泛型了, 所以返回值用 BaseResponse 即可
     * 用 泛型<> 啥都不写 会报错, 没有泛型的参数传递过来, 最后也是赋成 null
     * 用泛型的话, 由于没有传递 data, 所以只能是写 <Object>, 这就跟没有泛型是一样的了
     *
     * @param code
     * @param message
     * @param description
     * @return
     */
    public static BaseResponse error(int code, String message, String description) {
        // 错误返回， 数据就返回为 null 即可
        // return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());

        return new BaseResponse(code, null, message, description);
    }
    /*  这种写法也是可以的
    public static BaseResponse<Object> error(int code, String message, String description) {
        // 错误返回， 数据就返回为 null 即可
        // return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());

        return new BaseResponse<>(code, null, message, description);
    }*/

    /**
     * 失败
     *
     * @param errorCode
     * @param message 允许用户自己定义消息
     * @param description 允许用户自己定义详细描述信息
     * @return
     */
    public static BaseResponse error(ErrorCode errorCode, String message, String description) {
        // 错误返回， 数据就返回为 null 即可
        // return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());
        return new BaseResponse(errorCode.getCode(), null, message, description);
    }

    /**
     * 失败
     *
     * @param errorCode
     * @param description 允许用户自己定义详细描述信息
     * @return
     */
    public static BaseResponse error(ErrorCode errorCode, String description) {
        // 错误返回， 数据就返回为 null 即可
        // return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());
        return new BaseResponse(errorCode.getCode(), null, errorCode.getMessage(), description);
    }
}
